package com.course.server.service;

import com.course.server.domain.Travel;
import com.course.server.domain.TravelContent;
import com.course.server.domain.TravelExample;
import com.course.server.dto.*;
import com.course.server.enums.TravelStatusEnum;
import com.course.server.mapper.TravelContentMapper;
import com.course.server.mapper.TravelMapper;
import com.course.server.mapper.my.MyTravelMapper;
import com.course.server.util.CopyUtil;
import com.course.server.util.UuidUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Resource;
import java.util.List;
import java.util.Date;

@Service
public class TravelService {

    private static final Logger LOG = LoggerFactory.getLogger(TravelService.class);

    //---------------固定注入---------------
    @Resource
    private TravelMapper travelMapper;

    @Resource
    private MyTravelMapper myTravelMapper;

    @Resource
    private TravelCategoryService travelCategoryService;

    @Resource
    private TravelContentMapper travelContentMapper;


    /**
     * 新课列表查询，只查询已发布的，按创建日期倒序
     */
    public List<TravelDto> listNew(PageDto pageDto) {
        PageHelper.startPage(pageDto.getPage(), pageDto.getSize());
        TravelExample travelExample = new TravelExample();
        travelExample.createCriteria().andStepEqualTo(TravelStatusEnum.PUBLISH.getCode()).andStatusEqualTo(0);
        List<Travel> travelList = travelMapper.selectByExample(travelExample);
        return CopyUtil.copyList(travelList, TravelDto.class);
    }

    /*
    * 测试版本3:列表查询-集成分页
    * */

    public void list(TravelPageDto pageDto){
        //---------------mybatis-pagehelper插件使用---------------
        //初始化分页插件的属性:num第几页,size当前页显示条数,就近执行最近的select语句
        // 自动寻找执行第一个select语句会进行分页(.selectByExample)
        // 使用分页查询功能需要两条sql,一是查总记录数,一是当前页记录
        PageHelper.startPage(pageDto.getPage(),pageDto.getSize());//获取当前页和每页条数(前端传进来的)
        List<TravelDto> travelDtoList = myTravelMapper.list(pageDto);
        PageInfo<TravelDto> pageInfo = new PageInfo<>(travelDtoList);
        pageDto.setTotal(pageInfo.getTotal());
        pageDto.setList(travelDtoList);
        //---------------结束---------------
    }

    /*
    * 添加活动,判断是否有ID
    * */
    @Transactional
    public void save(TravelDto travelDto){
        Travel travel = CopyUtil.copy(travelDto,Travel.class);
        if(StringUtils.isEmpty(travelDto.getId())){
            this.insert(travel);
        }else {
            this.update(travel);
        }
        //批量保存分类
        travelCategoryService.saveBatch(travel.getId(),travelDto.getCategorys());
    }


    /*
     * 新增活动,没有ID
     * */
    private void insert(Travel travel){
        //---------------固定开始---------------
        //---------------从前端接收数据: Dto --> Domain---------------
        travel.setId(UuidUtil.getShortUuid());//前端没有传输ID值,需要我们自动生成
        travel.setStatus(0);
        Date date = new Date();
        travel.setCreatedAt(date);
        //---------------开始调用---------------
        travelMapper.insert(travel);
        //---------------结束---------------
    }

    /*
     * 修改活动,有ID
     * */
    private void update(Travel travel){
        //---------------固定开始---------------
        //---------------开始调用---------------
        Date date = new Date();
        travel.setUpdatedAt(date);
        travelMapper.updateByPrimaryKey(travel);
        //---------------结束---------------
    }

    /*
     * 根据ID查询活动
     * */
    public TravelDto selectById(String id){
        //---------------固定开始---------------
        //---------------开始调用---------------
        Travel travel = travelMapper.selectByPrimaryKey(id);
        return CopyUtil.copy(travel,TravelDto.class);
        //---------------结束---------------
    }

    /*
     * 模糊查询活动
     * */
    public void selectByName(PageDto pageDto){
        //---------------固定开始---------------
        //---------------开始调用---------------
        //---------------mybatis-pagehelper插件使用---------------
        //初始化分页插件的属性:num第几页,size当前页显示条数,就近执行最近的select语句
        // 自动寻找执行第一个select语句会进行分页(.selectByExample)
        // 使用分页查询功能需要两条sql,一是查总记录数,一是当前页记录
        PageHelper.startPage(pageDto.getPage(),pageDto.getSize());//获取当前页和每页条数(前端传进来的)

        //开始拼装SQL
        TravelExample example = new TravelExample();//创建对应的Example
        TravelExample.Criteria criteria = example.createCriteria();//创建对应的where

        //生成器启动的时候这部分需要手动更改因为实体名称不一致
        if(pageDto.getName()!=null&&!"".equals(pageDto.getName())){//不为空的时候拼接
            criteria.andNameLike("%"+pageDto.getName()+"%");
        }
        List<Travel> travelList = travelMapper.selectByExample(example);
        //创建一个 [页面信息对象] 存放查到的结果对象
        PageInfo<Travel> pageInfo = new PageInfo<>(travelList);
        //在 [页面信息对象] 中获取总条数 设置到pageDto数据传输对象
        pageDto.setTotal(pageInfo.getTotal());
        List<TravelDto> travelDtoList = CopyUtil.copyList(travelList, TravelDto.class);
        //[页面传输对象]=活动list数据传输对象+总条数
        pageDto.setList(travelDtoList);
        //---------------结束---------------
    }

    /*
    * 删除活动
    * */
    public void delete(String id){
        travelMapper.deleteByPrimaryKey(id);
    }

    /*
     *  修改状态值
     * */
    public void changedStatus(TravelDto travelDto){
        //---------------固定开始---------------
        //---------------开始调用---------------
        Travel travel = CopyUtil.copy(travelDto,Travel.class);
        travelMapper.updateByPrimaryKey(travel);
        //---------------结束---------------
    }

    /*
    *  更新时长
    * */
    public void updateTime(String travelId){
        LOG.info("更新时长:{}",travelId);
        myTravelMapper.updateTime(travelId);
    }

    /*
    * 查找内容
    * */
    public TravelContentDto findContent(String id){
        TravelContent content = travelContentMapper.selectByPrimaryKey(id);
        if(content == null){
            return null;
        }
        return CopyUtil.copy(content,TravelContentDto.class);
    }

    /*
    * 保存内容,含有新增和修改
    * */
    public int saveContent(TravelContentDto contentDto){
        TravelContent content = CopyUtil.copy(contentDto,TravelContent.class);
        int i = travelContentMapper.updateByPrimaryKeyWithBLOBs(content);
        if(i == 0){
            i = travelContentMapper.insert(content);
        }
        return i;
    }

    /*
    *
    * */
    @Transactional
    public void sort(SortDto sortDto){
        //修改当前记录的排序值
        myTravelMapper.updateSort(sortDto);
        //如果排序值变大
        if(sortDto.getNewSort() > sortDto.getOldSort()){
            myTravelMapper.moveSortsForward(sortDto);
        }
        //如果排序值变小
        if(sortDto.getNewSort() < sortDto.getOldSort()){
            myTravelMapper.moveSortsBackward(sortDto);
        }
    }
}


